package com.yqw.enhance.Int;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.function.ToLongFunction;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * @author abc
 *
 */
public class MoveWindow {

	/**
	 * 获取数据流的滑动平均系数
	 * @param values 时序数据流
	 * @param n 滑动窗口大小
	 * @return
	 */
	public static double[] simpleMovingAverange(double[] values, int n) {
		double[] sums = Arrays.copyOf(values, values.length);
		Arrays.parallelPrefix(sums, Double::sum);
		int start = n - 1;
		return IntStream.range(start, sums.length).mapToDouble(i -> {
			double prefix = i == start ? 0 : sums[i - n];
			return (sums[i] - prefix) / n;
		}).toArray();
	}

	public static void main(String[] args) {
		List<String> lisy = new ArrayList<String>();
		lisy.add("ssss");
		lisy.add(null);
		lisy.add("qqqqqqqqq");
		lisy.add("wwwwwwwwwwww");
		lisy.add("eeeeeeeee");
		List<String> efucl = elementFirstToUpperCaseLambdas(lisy);
		efucl.forEach(System.out::println);
		List<String> efuc = elementFirstToUpperCase(lisy);
		efuc.forEach(System.out::println);
	}

	/**
	 * 集合统计或累计计算
	 * 
	 * @param list
	 * @param function
	 * @return
	 */
	public <T> long countFeature(List<T> list, ToLongFunction<T> function) {
		return list.stream().mapToLong(function).sum();
	}

	/**
	 * 将字符串转为大写形式
	 * 
	 * @param wds
	 * @return
	 */
	public static List<String> allToUpperCase(List<String> wds) {
		return wds.stream().map(str -> str == null || str.length() == 0 ? str : str.toUpperCase()).collect(Collectors.toList());
	}

	/**
	 * 将首字母转换为大写，应用到所有列表元素
	 * 
	 * @param wds
	 * @return
	 */
	public static List<String> elementFirstToUpperCaseLambdas(List<String> wds) {
		return wds.stream().map(value -> {
			if (value != null && value.length() != 0) {
				char firstChar = Character.toUpperCase(value.charAt(0));
				return firstChar + value.substring(1);
			} else {
				return value;
			}
		}).collect(Collectors.toList());
	}

	/**
	 * 推荐将任何Lambda表达式改写为普通方法，然后使用方法引用直接引用
	 * 
	 * @param wds
	 * @return
	 */
	public static List<String> elementFirstToUpperCase(List<String> wds) {
		return wds.stream().map(Testing::firstToUpperCase).collect(Collectors.toList());
	}

	public static class Testing {
		public static String firstToUpperCase(String value) {
			if (value != null && value.length() != 0) {
				char firstChar = Character.toUpperCase(value.charAt(0));
				return firstChar + value.substring(1);
			} else {
				return value;
			}
		}
	}

	/**
	 * 对象集合映射成另一个对象集合
	 * 
	 * @param mappings
	 *            需要被映射的对象集合
	 * @param function
	 *            映射规则函数
	 * @return
	 */
	public static <T, R> List<R> allToAnotherAll(List<T> mappings, Function<T, R> function) {
		return mappings.stream().map(function).collect(Collectors.toList());
	}
}
